#include<stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>

#define InitSize 10    // 初始大小
typedef int ElemType;  // 定义元素类型

typedef struct DNode
{
    // 数据类型
    ElemType data;
    // 前驱和后驱指针
    struct DNode *prior, *next;
}DNode, *DLinklist;

// 初始化
bool InitDLinkList(DLinklist &L){
    L = (DNode *)malloc(sizeof(DNode));
    if (L==NULL) return false;
    L->next = NULL;
    L->prior = NULL;
    return true;
}

// 判空
bool Empty(DLinklist L){
    if (L->next == NULL) return true;
    else return false;
}

// 按位插入
bool InsertDNode(DLinklist &L, int i, ElemType e){
    if (i<1) return false;
    DNode *p;
    int j=0;
    p = L;
    while (p!=NULL && j<i-1) {     // 循环找到第i-1个结点
        p=p->next;
        j++;
    }
    if (p==NULL) return false;     // i值不合法
    DNode *s = (DNode *)malloc(sizeof(DNode));
    s->data = e;
    s->next = p->next;
    p->next = s;                  // 将结点s连到p之后
    return true;                  // 插入成功  
}

// 根据位序取出元素
DNode *GetElem(DLinklist L, int i){
    int j=1;
    DNode *p = L->next;
    if (i==0) return L;
    if (i<0) return NULL;
    while (p!=NULL && j<i)
    {
        p=p->next;
        j++;
    }
    return p;
}

// 包装元素
DNode *ChangleElem(ElemType e){
    DNode *s = (DNode *)malloc(sizeof(DNode));
    s->data = e;
    s->next = NULL;
    s->prior = NULL;
    return s;
}

// 后插
bool InsertNextDNode(DNode *p, DNode *s){
    if (p==NULL || s==NULL) return false;
    s->next = p->next;
    if (p->next != NULL)
        p->next->prior=s;
    s->prior = p;
    p->next = s;
    return true;
}

// 删除
bool DeleteNextDNode(DNode *p){
    if (p==NULL) return false;
    DNode *q = p->next;
    if (q==NULL) return false;
    p->next = q->next;
    if (q->next!=NULL)
        q->next->prior = p;
    free(q);
    return true;
}

// 释放链表
void DestoryList(DLinklist &L){
    while (L->next != NULL)
    {
        DeleteNextDNode(L);
    }
    free(L);
    L=NULL;
}

// 输出
void PrintList(DLinklist L){
    L = L->next;
    while (L != NULL) {
        printf("%d;", L->data);
        L = L->next;
    }
}


int main(){
    DLinklist L;
    InitDLinkList(L);
    // InsertNextDNode()
    InsertDNode(L, 1, 1);
    InsertDNode(L, 1, 2);
    InsertDNode(L, 1, 3);
    
    PrintList(L);
    printf("\n");
    // printf("delete : %d", e);
    system("pause");
    return 0;
}
